package com.longteng.lesson2.service;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Date;
import java.util.List;

/**
 * Created by li
 * DATE : 2018/12/9 0009
 * TIME : 22:58
 * PROJECT : java-lesson
 * PACKAGE : com.longteng.lesson
 *
 * @author <a href="mailto:55324936@qq.com">li</a>
 */
//一把菜刀
public class Halder {

    public void startTime(JoinPoint joinPoint){
        long startTime =System.currentTimeMillis();
        System.err.println(joinPoint.getTarget().getClass().getSimpleName()+"类"+joinPoint.getSignature().getName()+"方法开始执行时间:"+new Date());
    }

    public void endTime(JoinPoint joinPoint){
        System.err.println(joinPoint.getTarget().getClass().getSimpleName()+"类"+joinPoint.getSignature().getName()+"方法执行结束时间:"+new Date());
    }
    /**
     * 环绕通知,可以传入joinPoint参数进来
     * **/
    public Object aroundTest(ProceedingJoinPoint proceedingJoinPoint){
        //入参
//        joinPoint.getArgs();
//        System.err.println(proceedingJoinPoint.getTarget());
//        System.out.println(proceedingJoinPoint.getSignature().getName());
        Object arg =proceedingJoinPoint.getArgs()[0];
        String s =(String)arg;
        System.err.println("原来的环绕通知进来的参数:"+s);
        Object[] args =proceedingJoinPoint.getArgs();
        args[0] ="你好我是环绕通知修改后的参数";
        try {
            //这里是调用之前的处理
//            System.out.println("我是调用:"+proceedingJoinPoint.getSignature().getName()+"之前的输出");
            //去执行目标方法的处理,执行proceed()之后会去调用add方法
            System.out.println("录制请求之前的数据:");
            Object o = proceedingJoinPoint.proceed(args);
            System.out.println("录制请求之后的数据");
            //通过mq发送消息到我们自己做的了一个消息库
            List list =(List)o;
            list.clear();
            list.add("哈哈哈,我是修改后的返回参数");
//            System.out.println("我是调用:"+proceedingJoinPoint.getSignature().getName()+"之后的输出");
            //调用之后的处理
            return o;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return null;
    }

    public void afterThrow(JoinPoint joinPoint,Throwable ex){
        if(ex instanceof NullPointerException){
            System.out.println("方法:"+joinPoint.getSignature().getName());
            System.out.println("哈哈哈，空指针异常啦");
        }
    }
}
